﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include <set>
#include <string>
#include "GcmpDbCommonEdit.h"

namespace gcmp
{
    class ElementId;
    class Vector3d;
    class IDocument;

    /// \brief 阵列工具
    class GCMP_DB_COMMON_EDIT_EXPORT LinearArrayUtils
    {
    public:
        /// \brief 将指定Element数组，按照阵列向量的方向、距离和指定个数，进行拷贝复制
        /// \param[in] pDocument 阵列Element所在文档，不允许为空，否则报错
        /// \param[in] linearArrayElementIds 阵列Element数组，不允许为空，否则报错
        /// \param[in] arrayDirection 阵列的方向，向量的大小无效，会进行单位化
        /// \param[in] arrayDistance 阵列的距离，表示阵列Element之间在阵列方向上的距离
        /// \param[in] arrayCount 阵列个数，表示生成的阵列数组的个数，阵列数组包括源拷贝Element；若个数小于2，则阵列失败
        /// \param[out] pArrayElementIds 阵列生成的ElementId数组，键是被拷贝Element的id，值是阵列后拷贝生成的ElementId数组，数组按照阵列向量顺序
        /// \param[out] pErrorMessages 阵列失败的原因数组，ElementId是阵列失败的Element的id，后面的字符串用于描述阵列失败的原因
        /// \return 阵列成功返回true，失败返回false，只要有一个Element阵列失败，便视为失败
        static bool LinearArray(IDocument *pDocument, 
            const std::set<ElementId> &linearArrayElementIds,
            Vector3d arrayDirection,
            double arrayDistance,
            int arrayCount,
            std::map<ElementId, std::set<ElementId>> *pArrayedElementIds = nullptr,
            std::set<std::pair<ElementId, std::wstring>> *pErrorMessages = nullptr);
    };
}